package com.zzyl.nursing.service.impl;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.zzyl.common.exception.base.BaseException;
import com.zzyl.nursing.service.WechatService;
import org.springframework.stereotype.Component;

import java.nio.charset.Charset;
import java.util.HashMap;

import static com.zzyl.common.constant.CacheConstants.*;

@Component
public class WechatServiceImpl implements WechatService {
    /**
     * 获取openid
     *
     * @param code
     * @return
     */
    @Override
    public String getOpenid(String code) {
        //把code加入到map集合当中 请求微信服务器获取返回参数
        HashMap<String, Object> map = new HashMap<>();
        map.put("js_code", code);
        map.put("appid", WX_APPID);
        map.put("secret", WX_PASSWORD);
        //获取返回参数
        String s = HttpUtil.get(WX_HTTP, map);

        //把返回的参数专程json
        JSONObject entries = JSONUtil.parseObj(s);

        //判断返回的数据是否为空，则抛出异常
        if (ObjectUtil.isNotEmpty(entries.getInt("errcode"))) {
            throw new BaseException("获取微信openid失败", entries.getStr("errmsg"));

        }
        return entries.getStr("openid");
    }

    /**
     * 获取手机号
     *
     * @param detailCode
     * @return
     */
    @Override
    public String getPhone(String detailCode) {
        //获取token，请求微信服务器获取手机号
        String token = getToken();

        //把手机号的密钥传到集合当中
        HashMap<String, Object> map = new HashMap<>();
        map.put("code", detailCode);

        //组装url
        String url = PHONE_REQUEST_URL + token;

        //请求微信服务器,拿到返回参数
        String s = HttpUtil.post(url, JSONUtil.toJsonStr(map));

        //把服务器返回的对象转换成json
        JSONObject entries = JSONUtil.parseObj(s);
        if (!entries.getInt("errcode").equals(0)) {
            throw new BaseException("获取手机号失败", entries.getStr("errmsg"));
        }

        //从JSON中获取到手机号¬¬
        return entries.getJSONObject("phone_info").getStr("purePhoneNumber");
    }

    public String getToken() {
        //把密钥加到集合当中，请求微信服务器颁发token
        HashMap<String, Object> map = new HashMap<>();
        map.put("appid", WX_APPID);
        map.put("secret", WX_PASSWORD);

        //微信服务器返回的参数
        String s = HttpUtil.get(TOKEN_URL, map);

        //把返回的参数转换为json对象
        JSONObject entries = JSONUtil.parseObj(s);

        //判断返回的数据是否为空，则抛出异常
        if (ObjectUtil.isEmpty(entries)) {
            throw new BaseException("获取微信token失败");
        }
        //返回token
        return entries.getStr("access_token");

    }
}
